package com.tbynet.jwp.service.impl;

import com.jfinal.aop.Inject;
import com.jfinal.kit.Ret;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.IAtom;
import com.tbynet.jwp.framework.aop.Aop;
import com.tbynet.jwp.framework.core.JwpService;
import com.tbynet.jwp.service.spi.OptionManager;
import com.tbynet.jwp.model.Options;
import com.tbynet.jwp.repository.spi.OptionService;

import java.sql.SQLException;
import java.util.List;

/**
 * 选项服务编排管理类
 * @ClassName: OptionManager
 * @Description: 负责选项相关业务的编排和事务管理
 * @Author: 佰亿互联
 * @Date: 2025年11月4日
 *
 * @Copyright: 2025 www.tbynet.com Inc. All rights reserved.
 * 注意: 本内容仅限于内部传阅，禁止外泄以及用于其他的商业目
 */
@Aop(OptionManager.class)
public class OptionServiceImpl extends JwpService implements OptionManager {

    @Inject
    private OptionService optionService;

    /**
     * 批量更新选项（事务处理）
     * Manager层负责事务管理
     *
     * @param options 选项列表
     * @return 更新结果
     */
    public Ret batchUpdateOptions(List<Options> options) {
        log.info("开始批量更新选项，选项数量：{}", options.size());

        if (options == null || options.isEmpty()) {
            return Ret.fail("msg", "选项列表不能为空");
        }

        try {
            boolean success = Db.tx(new IAtom() {
                @Override
                public boolean run() throws SQLException {
                    try {
                        for (Options option : options) {
                            if (!saveOrUpdateOption(option)) {
                                log.error("保存选项失败，选项名：{}", option.getOptionName());
                                return false;
                            }
                        }
                        return true;
                    } catch (Exception e) {
                        log.error("批量更新选项事务执行失败", e);
                        throw new SQLException("批量更新选项事务失败", e);
                    }
                }
            });

            if (success) {
                log.info("批量更新选项成功，选项数量：{}", options.size());
                return Ret.ok("msg", "设置已保存");
            } else {
                log.error("批量更新选项失败，选项数量：{}", options.size());
                return Ret.fail("msg", "设置失败，请联系管理员");
            }
        } catch (Exception e) {
            log.error("批量更新选项流程异常", e);
            return Ret.fail("msg", "设置异常: " + e.getMessage());
        }
    }

    /**
     * 批量保存选项（事务处理）
     * Manager层负责事务管理
     *
     * @param options 选项列表
     * @return 保存结果
     */
    public Ret batchSaveOptions(List<Options> options) {
        log.info("开始批量保存选项，选项数量：{}", options.size());

        if (options == null || options.isEmpty()) {
            return Ret.fail("msg", "选项列表不能为空");
        }

        try {
            boolean success = Db.tx(new IAtom() {
                @Override
                public boolean run() throws SQLException {
                    try {
                        for (Options option : options) {
                            if (!option.save()) {
                                log.error("保存选项失败，选项名：{}", option.getOptionName());
                                return false;
                            }
                        }
                        return true;
                    } catch (Exception e) {
                        log.error("批量保存选项事务执行失败", e);
                        throw new SQLException("批量保存选项事务失败", e);
                    }
                }
            });

            if (success) {
                log.info("批量保存选项成功，选项数量：{}", options.size());
                return Ret.ok("msg", "保存成功");
            } else {
                log.error("批量保存选项失败，选项数量：{}", options.size());
                return Ret.fail("msg", "保存失败");
            }
        } catch (Exception e) {
            log.error("批量保存选项流程异常", e);
            return Ret.fail("msg", "保存异常: " + e.getMessage());
        }
    }

    /**
     * 保存或更新单个选项
     * 私有方法，在事务中调用
     *
     * @param option 选项对象
     * @return 操作结果
     */
    private boolean saveOrUpdateOption(Options option) {
        try {
            Options existingOption = optionService.getOption(option.getOptionName());
            if (existingOption == null) {
                // 新选项，设置自动加载
                option.setAutoload("yes");
                return option.save();
            } else {
                // 更新现有选项
                existingOption.setOptionValue(option.getOptionValue());
                return existingOption.update();
            }
        } catch (Exception e) {
            log.error("保存或更新选项失败，选项名：{}", option.getOptionName(), e);
            return false;
        }
    }
}